home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 25 / Cream of the Crop 25.iso / os2 / kzr0597.zip / BIN.CMD < prev    next >
OS/2 REXX Batch file  |  1997-02-09  |  4KB  |  119 lines

  1. /*    REXX-Programm  bin.cmd  für die Binomial-Koeffizienten    */
  2. /*               (gesprochen: "n über m")                       */
  3.    "@ echo off"
  4.  
  5.    Call RxFuncAdd 'SysLoadFuncs', RexxUtil, 'SysLoadFuncs'
  6.    Call SysLoadFuncs
  7.    signal on syntax name binMsg
  8.  
  9. /* Diese Variablen müssen für jede Prozedur definiert werden, damit die  */
  10. /* Prozedur die Variable bufND kennt und die Variable ND übernehmen kann.*/
  11.    Pfd=SysSearchPath("PATH", "kzr.cmd")
  12.    lp=LastPos("\", Pfd)
  13.    Pfd=DelStr(Pfd, 1+lp)
  14.    bufND =Pfd||"NDZahl.DAT"
  15.    bufMsg=Pfd||"Meldung.DAT"
  16.    ND = LineIn(bufND, 1)
  17.  
  18.    parse arg n,m,s
  19.  
  20.    if length(s) > 0 then
  21.    do
  22.      ret=LineOut(bufMsg, "Im Argument von  bin(.. , ..)  ist mindestens  1  nicht zulässiges Komma !")
  23.   /* "bufMsg" und  "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
  24.   /*  damit in den diesbezüglichen temporären Dateien                      */
  25.   /*  Meldungen und ND-Werte nicht aneinandergehängt werden.               */
  26.      EXIT
  27.    end
  28.  
  29.    p0p=n*m /* Diese Anweisung provoziert eine Syntax-Fehlermeldung */
  30.  
  31.    nn=n//1
  32.    if (nn<>0) then
  33.    do
  34.       ret=LineOut(bufMsg, "Das erste Argument der Funktion  bin(...)  muß eine ganze Zahl sein !")
  35.   /* "bufMsg" und  "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
  36.   /*  damit in den diesbezüglichen temporären Dateien                      */
  37.   /*  Meldungen und ND-Werte nicht aneinandergehängt werden.               */
  38.       EXIT
  39.     end
  40.  
  41.    mm=m//1
  42.    if (mm<>0) then
  43.    do
  44.       ret=LineOut(bufMsg, "Das zweite Argument der Funktion  bin(...)  muß eine ganze Zahl sein !")
  45.   /* "bufMsg" und  "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
  46.   /*  damit in den diesbezüglichen temporären Dateien                      */
  47.   /*  Meldungen und ND-Werte nicht aneinandergehängt werden.               */
  48.       EXIT
  49.     end
  50.  
  51.    if (n>2000) then
  52.    do
  53.      ret=LineOut(bufMsg, "Das erste Argument der Funktion  bin(.. , ..)  darf 2000 nicht überschreiten !")
  54.   /* "bufMsg" und  "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
  55.   /*  damit in den diesbezüglichen temporären Dateien                      */
  56.   /*  Meldungen und ND-Werte nicht aneinandergehängt werden.               */
  57.      EXIT
  58.    end
  59.  
  60.    if (n<m) then
  61.    do
  62.       ret=LineOut(bufMsg, "In der Funktion  bin(...)  muß die erste Variable größer als die Zweite sein !")
  63.   /* "bufMsg" und  "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
  64.   /*  damit in den diesbezüglichen temporären Dateien                      */
  65.   /*  Meldungen und ND-Werte nicht aneinandergehängt werden.               */
  66.       EXIT
  67.    end
  68.  
  69.    if m=1 then do y=n; SIGNAL A; EXIT; end
  70.    if m=n then do y=1; SIGNAL A; EXIT; end
  71.    if m=0 then do y=1; SIGNAL A; EXIT; end
  72.  
  73.    numeric digits ND+10
  74.  
  75.    um=1; i=1 /* Berechnung von n! */
  76.    do while (i<m+1)
  77.      um=um*i
  78.      i=i+1
  79.    end
  80.  
  81.    un=1; i=1 /* Berechnung von m! */
  82.    do while (i<n+1)
  83.      un=un*i
  84.      i=i+1
  85.    end
  86.  
  87.    unm=1; i=1 /* Berechnung von (n-m)! */
  88.    do while (i<n-m+1)
  89.      unm=unm*i
  90.      i=i+1
  91.    end
  92.  
  93.    y=un/(um*unm)
  94.  
  95. A:
  96.    numeric digits ND
  97.    return(Format(y))
  98.  
  99. binMsg:
  100.    sf=ErrorText(RC)
  101.    if  Pos("Arithmetic overflow", sf) > 0 | Pos("Invalid whole", sf) >0 then
  102.    do
  103.      ret=LineOut(bufMsg, "Es müssen zu große Zahlenwerte verarbeitet werden !")
  104.   /* "bufMsg" und  "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
  105.   /*  damit in den diesbezüglichen temporären Dateien                      */
  106.   /*  Meldungen und ND-Werte nicht aneinandergehängt werden.               */
  107.      EXIT
  108.    end
  109.  
  110.    if  Pos("Bad arithmetic conversion", sf) > 0 then
  111.    do
  112.      ret=LineOut(bufMsg, "Sie haben in  bin(...)  kein gültiges Argument eingegeben !")
  113.   /* "bufMsg" und  "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
  114.   /*  damit in den diesbezüglichen temporären Dateien                      */
  115.   /*  Meldungen und ND-Werte nicht aneinandergehängt werden.               */
  116.      EXIT
  117.    end
  118.  
  119.